#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <ctime>
#include <string>

// #define NUM 10

using namespace std;

void *threadRun(void* args)
{
    const char*name = static_cast<const char *>(args);

    int cnt = 5;
    while(cnt)
    {
        cout << name << " is running: " << cnt-- << " obtain self id: " << pthread_self() << endl;
        sleep(1);
    }

    pthread_exit((void*)11); 

    // PTHREAD_CANCELED; #define PTHREAD_CANCELED ((void *) -1)
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, threadRun, (void*)"thread 1");
    sleep(3);

    pthread_cancel(tid);

    void *ret = nullptr;
    pthread_join(tid, &ret);
    cout << " new thread exit : " << (int64_t)ret << "quit thread: " << tid << endl;
    return 0;
}


// void* thread_run(void* args)
// {
//     while (true)
//     {
//         cout << "new thread running" << endl;
//         sleep(1);
//         break;
//     }
//     pthread_exit((void*)1);
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, thread_run, nullptr);
//     while (true)
//     {
//         cout << "main thread running" << endl;
//     }
//     pthread_join(tid, nullptr);
//     return 0;
// }

// enum { OK=0, ERROR };

// class ThreadData
// {
// public:
//     ThreadData(const string& name, int id, time_t createTime, int top):_name(name), _id(id), _createTime((uint64_t)createTime), _status(OK), _top(top), _result(0)
//     {}
//     ~ThreadData()
//     {}
// public:
//     string _name;
//     int _id;
//     uint64_t _createTime;

//     int _status;
//     int _top;
//     int _result;
// };

// void* thread_run(void* args)
// {
//     ThreadData* td = static_cast<ThreadData*>(args);

//     for (int i = 1; i <= td->_top; ++i)
//     {
//         td->_result += i;
//     }

//     cout << td->_name << "cal down" << endl;
//     pthread_exit(td);
//     // // char* tname = (char*)args;
//     // ThreadData* td = static_cast<ThreadData*>(args);
//     // while (true)
//     // {
//     //     cout << "new thread runing, my thread name is: " << td->_name << "create time: " << td->_createTime << "id: " << td->_id << endl;
//     //     sleep(3);
//     //     break;
//     // }
//     // delete td;
//     // pthread_exit((void*)1);
//     // // return nullptr;
// }

// int main()
// {
//     pthread_t tids[NUM];
//     for (int i = 0; i < NUM; ++i)
//     {
//         char tname[64];
//         snprintf(tname, 64, "thread-%d", i+1);
//         ThreadData* td = new ThreadData(tname, i+1, time(nullptr), 100+i*5);
//         pthread_create(tids+i, nullptr, thread_run, td);
//         sleep(1);
//     }

//     // while (true)
//     // {
//     //     cout << "main thread running, new thread id: " << endl;
//     //     sleep(1);
//     // }
//     void* ret = nullptr;

//     for (int i = 0; i < NUM; ++i)
//     {
//         int n = pthread_join(tids[i], &ret);
//         if (n != 0) cerr << "pthread_join error" << endl;
//         ThreadData* td = (ThreadData*)ret;
//         if (td->_status == OK)
//         {
//             cout << td->_name << "计算的结果是: " << td->_result << "(它要计算的是[1, " << td->_top << "])" << endl;
//         }
//     }
//     return 0;
// } 